🎖️GitЯра🎖️
src/Dispatcher.cpp 890a2e2cffa98dea3ca88db3c3aba72ef23ff3f7 (890a2e2c) Text, 13.35 KB
Tff7b72#Tff7b72include T8b949e"Dispatcher.h"
Tff7b72#Tff7b72if MESH_PACKET_LOGGING
Tff7b72#Tff7b72include T8b949e<Arduino.h>
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72include T8b949e<math.h>
Tff7b72namespace T7ee787mesh Tb4b4b4{
Tff7b72#Tff7b72define MAX_RX_DELAY_MILLIS 32000 T8b949e// 32 seconds
Tff7b72#Tff7b72define MIN_TX_BUDGET_RESERVE_MS 100 T8b949e// min budget (ms) required before allowing next TX
Tff7b72#Tff7b72define MIN_TX_BUDGET_AIRTIME_DIV 2 T8b949e// require at least 1/N of estimated airtime as budget before TX
Tff7b72#Tff7b72ifndef NOISE_FLOOR_CALIB_INTERVAL
Tff7b72#Tff7b72define NOISE_FLOOR_CALIB_INTERVAL 2000 T8b949e// 2 seconds
Tff7b72#Tff7b72endif
Tffa657void Td2a8ffDispatcher::beginTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3n_sent_flood Tff7b72= Te6edf3n_sent_direct Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3n_recv_flood Tff7b72= Te6edf3n_recv_direct Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3_err_flags Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3radio_nonrx_start Tff7b72= Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3duty_cycle_window_ms Tff7b72= Te6edf3getDutyCycleWindowMsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657float Te6edf3duty_cycle Tff7b72= T79c0ff1.0f Tff7b72/ Tb4b4b4(T79c0ff1.0f Tff7b72+ Te6edf3getAirtimeBudgetFactorTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3tx_budget_ms Tff7b72= Tb4b4b4(Tffa657unsigned Tffa657longTb4b4b4)Tb4b4b4(Te6edf3duty_cycle_window_ms Tff7b72* Te6edf3duty_cycleTb4b4b4)Tb4b4b4;
Te6edf3last_budget_update Tff7b72= Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3_radioTff7b72-Tff7b72>Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3prev_isrecv_mode Tff7b72= Te6edf3_radioTff7b72-Tff7b72>Te6edf3isInRecvModeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657float Td2a8ffDispatcher::getAirtimeBudgetFactorTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return T79c0ff1.0Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffDispatcher::updateTxBudgetTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657unsigned Tffa657long Te6edf3now Tff7b72= Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657unsigned Tffa657long Te6edf3elapsed Tff7b72= Te6edf3now Tff7b72- Te6edf3last_budget_updateTb4b4b4;
Tffa657float Te6edf3duty_cycle Tff7b72= T79c0ff1.0f Tff7b72/ Tb4b4b4(T79c0ff1.0f Tff7b72+ Te6edf3getAirtimeBudgetFactorTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tffa657unsigned Tffa657long Te6edf3max_budget Tff7b72= Tb4b4b4(Tffa657unsigned Tffa657longTb4b4b4)Tb4b4b4(Te6edf3getDutyCycleWindowMsTb4b4b4(Tb4b4b4) Tff7b72* Te6edf3duty_cycleTb4b4b4)Tb4b4b4;
Tffa657unsigned Tffa657long Te6edf3refill Tff7b72= Tb4b4b4(Tffa657unsigned Tffa657longTb4b4b4)Tb4b4b4(Te6edf3elapsed Tff7b72* Te6edf3duty_cycleTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3refill Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3tx_budget_ms Tff7b72+Tff7b72= Te6edf3refillTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3tx_budget_ms Tff7b72> Te6edf3max_budgetTb4b4b4) Tb4b4b4{
Te6edf3tx_budget_ms Tff7b72= Te6edf3max_budgetTb4b4b4;
Tb4b4b4}
Te6edf3last_budget_update Tff7b72= Te6edf3nowTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657int Td2a8ffDispatcher::calcRxDelayTb4b4b4(Tffa657float Te6edf3scoreTb4b4b4, Tffa657uint32_t Te6edf3air_timeTb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return Tb4b4b4(Tffa657intTb4b4b4) Tb4b4b4(Tb4b4b4(Te6edf3powTb4b4b4(T79c0ff10Tb4b4b4, T79c0ff0.85f Tff7b72- Te6edf3scoreTb4b4b4) Tff7b72- T79c0ff1.0Tb4b4b4) Tff7b72* Te6edf3air_timeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657uint32_t Td2a8ffDispatcher::getCADFailRetryDelayTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return T79c0ff200Tb4b4b4;
Tb4b4b4}
Tffa657uint32_t Td2a8ffDispatcher::getCADFailMaxDurationTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return T79c0ff4000Tb4b4b4; T8b949e// 4 seconds
Tb4b4b4}
Tffa657void Td2a8ffDispatcher::loopTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3millisHasNowPassedTb4b4b4(Te6edf3next_floor_calib_timeTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_radioTff7b72-Tff7b72>Te6edf3triggerNoiseFloorCalibrateTb4b4b4(Te6edf3getInterferenceThresholdTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3_radioTff7b72-Tff7b72>Te6edf3setCADEnabledTb4b4b4(Te6edf3getCADEnabledTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3next_floor_calib_time Tff7b72= Te6edf3futureMillisTb4b4b4(Te6edf3NOISE_FLOOR_CALIB_INTERVALTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3_radioTff7b72-Tff7b72>Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// check for radio 'stuck' in mode other than Rx
Tffa657bool Te6edf3is_recv Tff7b72= Te6edf3_radioTff7b72-Tff7b72>Te6edf3isInRecvModeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3is_recv Tff7b72!Tff7b72= Te6edf3prev_isrecv_modeTb4b4b4) Tb4b4b4{
Te6edf3prev_isrecv_mode Tff7b72= Te6edf3is_recvTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3is_recvTb4b4b4) Tb4b4b4{
Te6edf3radio_nonrx_start Tff7b72= Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3is_recv Tff7b72&Tff7b72& Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3radio_nonrx_start Tff7b72> T79c0ff8000Tb4b4b4) Tb4b4b4{ T8b949e// radio has not been in Rx mode for 8 seconds!
Te6edf3_err_flags Tff7b72|Tff7b72= Te6edf3ERR_EVENT_STARTRX_TIMEOUTTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3outboundTb4b4b4) Tb4b4b4{ T8b949e// waiting for outbound send to be completed
Tff7b72if Tb4b4b4(Te6edf3_radioTff7b72-Tff7b72>Te6edf3isSendCompleteTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tffa657long Te6edf3t Tff7b72= Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3outbound_startTb4b4b4;
Te6edf3total_air_time Tff7b72+Tff7b72= Te6edf3tTb4b4b4;
T8b949e//Serial.print(" airtime="); Serial.println(t);
Te6edf3updateTxBudgetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3t Tff7b72> Te6edf3tx_budget_msTb4b4b4) Tb4b4b4{
Te6edf3tx_budget_ms Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3tx_budget_ms Tff7b72-Tff7b72= Te6edf3tTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3tx_budget_ms Tff7b72< Te6edf3MIN_TX_BUDGET_RESERVE_MSTb4b4b4) Tb4b4b4{
Tffa657float Te6edf3duty_cycle Tff7b72= T79c0ff1.0f Tff7b72/ Tb4b4b4(T79c0ff1.0f Tff7b72+ Te6edf3getAirtimeBudgetFactorTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tffa657unsigned Tffa657long Te6edf3needed Tff7b72= Te6edf3MIN_TX_BUDGET_RESERVE_MS Tff7b72- Te6edf3tx_budget_msTb4b4b4;
Te6edf3next_tx_time Tff7b72= Te6edf3futureMillisTb4b4b4(Tb4b4b4(Tffa657unsigned Tffa657longTb4b4b4)Tb4b4b4(Te6edf3needed Tff7b72/ Te6edf3duty_cycleTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3next_tx_time Tff7b72= Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3_radioTff7b72-Tff7b72>Te6edf3onSendFinishedTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3logTxTb4b4b4(Te6edf3outboundTb4b4b4, T79c0ff2 Tff7b72+ Te6edf3outboundTff7b72-Tff7b72>Te6edf3getPathByteLenTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3outboundTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3outboundTff7b72-Tff7b72>Te6edf3isRouteFloodTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3n_sent_floodTff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3n_sent_directTff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4}
Te6edf3releasePacketTb4b4b4(Te6edf3outboundTb4b4b4)Tb4b4b4; T8b949e// return to pool
Te6edf3outbound Tff7b72= Tffa657NULLTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3millisHasNowPassedTb4b4b4(Te6edf3outbound_expiryTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Dispatcher::loop(): WARNING: outbound packed send timed out!Ta5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3_radioTff7b72-Tff7b72>Te6edf3onSendFinishedTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3logTxFailTb4b4b4(Te6edf3outboundTb4b4b4, T79c0ff2 Tff7b72+ Te6edf3outboundTff7b72-Tff7b72>Te6edf3getPathByteLenTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3outboundTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4)Tb4b4b4;
Te6edf3releasePacketTb4b4b4(Te6edf3outboundTb4b4b4)Tb4b4b4; T8b949e// return to pool
Te6edf3outbound Tff7b72= Tffa657NULLTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72returnTb4b4b4; T8b949e// can't do any more radio activity until send is complete or timed out
Tb4b4b4}
T8b949e// going back into receive mode now...
Te6edf3next_agc_reset_time Tff7b72= Te6edf3futureMillisTb4b4b4(Te6edf3getAGCResetIntervalTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3getAGCResetIntervalTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff0 Tff7b72&Tff7b72& Te6edf3millisHasNowPassedTb4b4b4(Te6edf3next_agc_reset_timeTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_radioTff7b72-Tff7b72>Te6edf3resetAGCTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3next_agc_reset_time Tff7b72= Te6edf3futureMillisTb4b4b4(Te6edf3getAGCResetIntervalTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// check inbound (delayed) queue
Tb4b4b4{
Te6edf3PacketTff7b72* Te6edf3pkt Tff7b72= Te6edf3_mgrTff7b72-Tff7b72>Te6edf3getNextInboundTb4b4b4(Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3pktTb4b4b4) Tb4b4b4{
Te6edf3processRecvPacketTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3checkRecvTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3checkSendTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657bool Td2a8ffDispatcher::tryParsePacketTb4b4b4(Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3rawTb4b4b4, Tffa657int Te6edf3lenTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3pktTff7b72-Tff7b72>Te6edf3header Tff7b72= Te6edf3rawTb4b4b4[Te6edf3iTff7b72+Tff7b72+Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadVerTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3PAYLOAD_VER_1Tb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Dispatcher::checkRecv(): unsupported packet versionTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3hasTransportCodesTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3transport_codesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Tff7b72&Te6edf3rawTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4; Te6edf3i Tff7b72+Tff7b72= T79c0ff2Tb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3transport_codesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Tff7b72&Te6edf3rawTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4; Te6edf3i Tff7b72+Tff7b72= T79c0ff2Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3pktTff7b72-Tff7b72>Te6edf3transport_codesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3transport_codesTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
Te6edf3pktTff7b72-Tff7b72>Te6edf3path_len Tff7b72= Te6edf3rawTb4b4b4[Te6edf3iTff7b72+Tff7b72+Tb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3path_mode Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3path_len Tff7b72>Tff7b72> T79c0ff6Tb4b4b4; T8b949e// upper 2 bits (legacy firmware: 00)
Tff7b72if Tb4b4b4(Te6edf3path_mode Tff7b72=Tff7b72= T79c0ff3Tb4b4b4) Tb4b4b4{ T8b949e// Reserved for future
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Dispatcher::checkRecv(): unsupported path mode: 3Ta5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}
Tffa657uint8_t Te6edf3path_byte_len Tff7b72= Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3path_len Tff7b72& T79c0ff63Tb4b4b4) Tff7b72* Te6edf3pktTff7b72-Tff7b72>Te6edf3getPathHashSizeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3path_byte_len Tff7b72> Te6edf3MAX_PATH_SIZE Tff7b72|Tff7b72| Te6edf3i Tff7b72+ Te6edf3path_byte_len Tff7b72> Te6edf3lenTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Dispatcher::checkRecv(): partial or corrupt packet received, len=%dTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}
Te6edf3memcpyTb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3pathTb4b4b4, Tff7b72&Te6edf3rawTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Te6edf3path_byte_lenTb4b4b4)Tb4b4b4; Te6edf3i Tff7b72+Tff7b72= Te6edf3path_byte_lenTb4b4b4;
Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_len Tff7b72= Te6edf3len Tff7b72- Te6edf3iTb4b4b4; T8b949e// payload is remainder
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_len Tff7b72> Tff7b72sizeofTb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Dispatcher::checkRecv(): packet payload too big, payload_len=%dTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4)Tb4b4b4;
Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}
Te6edf3memcpyTb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4, Tff7b72&Te6edf3rawTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4)Tb4b4b4;
Tff7b72return Tffa657trueTb4b4b4; T8b949e// success
Tb4b4b4}
Tffa657void Td2a8ffDispatcher::checkRecvTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4;
Tffa657float Te6edf3scoreTb4b4b4;
Tffa657uint32_t Te6edf3air_timeTb4b4b4;
Tb4b4b4{
Tffa657uint8_t Te6edf3rawTb4b4b4[Te6edf3MAX_TRANS_UNITTff7b72+T79c0ff1Tb4b4b4]Tb4b4b4;
Tffa657int Te6edf3len Tff7b72= Te6edf3_radioTff7b72-Tff7b72>Te6edf3recvRawTb4b4b4(Te6edf3rawTb4b4b4, Te6edf3MAX_TRANS_UNITTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3logRxRawTb4b4b4(Te6edf3_radioTff7b72-Tff7b72>Te6edf3getLastSNRTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3_radioTff7b72-Tff7b72>Te6edf3getLastRSSITb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3rawTb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3pkt Tff7b72= Te6edf3_mgrTff7b72-Tff7b72>Te6edf3allocNewTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3pkt Tff7b72=Tff7b72= Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Dispatcher::checkRecv(): WARNING: received data, no unused packets available!Ta5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3tryParsePacketTb4b4b4(Te6edf3pktTb4b4b4, Te6edf3rawTb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3pktTff7b72-Tff7b72>Te6edf3_snr Tff7b72= Te6edf3_radioTff7b72-Tff7b72>Te6edf3getLastSNRTb4b4b4(Tb4b4b4) Tff7b72* T79c0ff4.0fTb4b4b4;
Te6edf3score Tff7b72= Te6edf3_radioTff7b72-Tff7b72>Te6edf3packetScoreTb4b4b4(Te6edf3_radioTff7b72-Tff7b72>Te6edf3getLastSNRTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3air_time Tff7b72= Te6edf3_radioTff7b72-Tff7b72>Te6edf3getEstAirtimeForTb4b4b4(Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3rx_air_time Tff7b72+Tff7b72= Te6edf3air_timeTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3_mgrTff7b72-Tff7b72>Te6edf3freeTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4; T8b949e// put back into pool
Te6edf3pkt Tff7b72= Tffa657NULLTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3pkt Tff7b72= Tffa657NULLTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3pktTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if MESH_PACKET_LOGGING
Te6edf3SerialTb4b4b4.Te6edf3printTb4b4b4(Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3SerialTb4b4b4.Te6edf3printfTb4b4b4(Ta5d6ff"Ta5d6ff: RX, len=%d (type=%d, route=%s, payload_len=%d) SNR=%d RSSI=%d score=%d time=%dTa5d6ff"Tb4b4b4,
Te6edf3pktTff7b72-Tff7b72>Te6edf3getRawLengthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3isRouteDirectTb4b4b4(Tb4b4b4) Tff7b72? Ta5d6ff"Ta5d6ffDTa5d6ff" Tff7b72: Ta5d6ff"Ta5d6ffFTa5d6ff"Tb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4,
Tb4b4b4(Tffa657intTb4b4b4)Te6edf3pktTff7b72-Tff7b72>Te6edf3getSNRTb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4(Tffa657intTb4b4b4)Te6edf3_radioTff7b72-Tff7b72>Te6edf3getLastRSSITb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4(Tffa657intTb4b4b4)Tb4b4b4(Te6edf3scoreTff7b72*T79c0ff1000Tb4b4b4)Tb4b4b4, Te6edf3air_timeTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657uint8_t Te6edf3packet_hashTb4b4b4[Te6edf3MAX_HASH_SIZETb4b4b4]Tb4b4b4;
Te6edf3pktTff7b72-Tff7b72>Te6edf3calculatePacketHashTb4b4b4(Te6edf3packet_hashTb4b4b4)Tb4b4b4;
Te6edf3SerialTb4b4b4.Te6edf3printTb4b4b4(Ta5d6ff"Ta5d6ff hash=Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3meshTff7b72:Tff7b72:Te6edf3UtilsTff7b72:Tff7b72:Te6edf3printHexTb4b4b4(Te6edf3SerialTb4b4b4, Te6edf3packet_hashTb4b4b4, Te6edf3MAX_HASH_SIZETb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_PATH Tff7b72|Tff7b72| Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_REQ
Tff7b72|Tff7b72| Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_RESPONSE Tff7b72|Tff7b72| Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_TXT_MSGTb4b4b4) Tb4b4b4{
Te6edf3SerialTb4b4b4.Te6edf3printfTb4b4b4(Ta5d6ff"Ta5d6ff [%02X -> %02X]Tffea00\nTa5d6ff"Tb4b4b4, Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3SerialTb4b4b4.Te6edf3printfTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Te6edf3logRxTb4b4b4(Te6edf3pktTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3getRawLengthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3scoreTb4b4b4)Tb4b4b4; T8b949e// hook for custom logging
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3isRouteFloodTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3n_recv_floodTff7b72+Tff7b72+Tb4b4b4;
Tffa657int Te6edf3_delay Tff7b72= Te6edf3calcRxDelayTb4b4b4(Te6edf3scoreTb4b4b4, Te6edf3air_timeTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_delay Tff7b72< T79c0ff50Tb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Dispatcher::checkRecv(), score delay below threshold (%d)Ta5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3_delayTb4b4b4)Tb4b4b4;
Te6edf3processRecvPacketTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4; T8b949e// is below the score delay threshold, so process immediately
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Dispatcher::checkRecv(), score delay is: %d millisTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3_delayTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_delay Tff7b72> Te6edf3MAX_RX_DELAY_MILLISTb4b4b4) Tb4b4b4{
Te6edf3_delay Tff7b72= Te6edf3MAX_RX_DELAY_MILLISTb4b4b4;
Tb4b4b4}
Te6edf3_mgrTff7b72-Tff7b72>Te6edf3queueInboundTb4b4b4(Te6edf3pktTb4b4b4, Te6edf3futureMillisTb4b4b4(Te6edf3_delayTb4b4b4)Tb4b4b4)Tb4b4b4; T8b949e// add to delayed inbound queue
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3n_recv_directTff7b72+Tff7b72+Tb4b4b4;
Te6edf3processRecvPacketTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tffa657void Td2a8ffDispatcher::processRecvPacketTb4b4b4(Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4) Tb4b4b4{
Te6edf3DispatcherAction Te6edf3action Tff7b72= Te6edf3onRecvPacketTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3action Tff7b72=Tff7b72= Te6edf3ACTION_RELEASETb4b4b4) Tb4b4b4{
Te6edf3_mgrTff7b72-Tff7b72>Te6edf3freeTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3action Tff7b72=Tff7b72= Te6edf3ACTION_MANUAL_HOLDTb4b4b4) Tb4b4b4{
T8b949e// sub-class is wanting to manually hold Packet instance, and call releasePacket() at appropriate time
Tb4b4b4} Tff7b72else Tb4b4b4{ T8b949e// ACTION_RETRANSMIT*
Tffa657uint8_t Te6edf3priority Tff7b72= Tb4b4b4(Te6edf3action Tff7b72>Tff7b72> T79c0ff24Tb4b4b4) Tff7b72- T79c0ff1Tb4b4b4;
Tffa657uint32_t Te6edf3_delay Tff7b72= Te6edf3action Tff7b72& T79c0ff0xFFFFFFTb4b4b4;
Te6edf3_mgrTff7b72-Tff7b72>Te6edf3queueOutboundTb4b4b4(Te6edf3pktTb4b4b4, Te6edf3priorityTb4b4b4, Te6edf3futureMillisTb4b4b4(Te6edf3_delayTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657void Td2a8ffDispatcher::checkSendTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_mgrTff7b72-Tff7b72>Te6edf3getOutboundCountTb4b4b4(Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tff7b72returnTb4b4b4;
Te6edf3updateTxBudgetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657uint32_t Te6edf3est_airtime Tff7b72= Te6edf3_radioTff7b72-Tff7b72>Te6edf3getEstAirtimeForTb4b4b4(Te6edf3MAX_TRANS_UNITTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3tx_budget_ms Tff7b72< Te6edf3est_airtime Tff7b72/ Te6edf3MIN_TX_BUDGET_AIRTIME_DIVTb4b4b4) Tb4b4b4{
Tffa657float Te6edf3duty_cycle Tff7b72= T79c0ff1.0f Tff7b72/ Tb4b4b4(T79c0ff1.0f Tff7b72+ Te6edf3getAirtimeBudgetFactorTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tffa657unsigned Tffa657long Te6edf3needed Tff7b72= Te6edf3est_airtime Tff7b72/ Te6edf3MIN_TX_BUDGET_AIRTIME_DIV Tff7b72- Te6edf3tx_budget_msTb4b4b4;
Te6edf3next_tx_time Tff7b72= Te6edf3futureMillisTb4b4b4(Tb4b4b4(Tffa657unsigned Tffa657longTb4b4b4)Tb4b4b4(Te6edf3needed Tff7b72/ Te6edf3duty_cycleTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3millisHasNowPassedTb4b4b4(Te6edf3next_tx_timeTb4b4b4)Tb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_radioTff7b72-Tff7b72>Te6edf3isReceivingTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3cad_busy_start Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3cad_busy_start Tff7b72= Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4)Tb4b4b4; T8b949e// record when CAD busy state started
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3cad_busy_start Tff7b72> Te6edf3getCADFailMaxDurationTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_err_flags Tff7b72|Tff7b72= Te6edf3ERR_EVENT_CAD_TIMEOUTTb4b4b4;
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Dispatcher::checkSend(): CAD busy max duration reached!Ta5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
T8b949e// channel activity has gone on too long... (Radio might be in a bad state)
T8b949e// force the pending transmit below...
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3next_tx_time Tff7b72= Te6edf3futureMillisTb4b4b4(Te6edf3getCADFailRetryDelayTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3cad_busy_start Tff7b72= T79c0ff0Tb4b4b4; T8b949e// reset busy state
Te6edf3outbound Tff7b72= Te6edf3_mgrTff7b72-Tff7b72>Te6edf3getNextOutboundTb4b4b4(Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3outboundTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3len Tff7b72= T79c0ff0Tb4b4b4;
Tffa657uint8_t Te6edf3rawTb4b4b4[Te6edf3MAX_TRANS_UNITTb4b4b4]Tb4b4b4;
Te6edf3rawTb4b4b4[Te6edf3lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3outboundTff7b72-Tff7b72>Te6edf3headerTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3outboundTff7b72-Tff7b72>Te6edf3hasTransportCodesTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3rawTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Tff7b72&Te6edf3outboundTff7b72-Tff7b72>Te6edf3transport_codesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4; Te6edf3len Tff7b72+Tff7b72= T79c0ff2Tb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3rawTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Tff7b72&Te6edf3outboundTff7b72-Tff7b72>Te6edf3transport_codesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4; Te6edf3len Tff7b72+Tff7b72= T79c0ff2Tb4b4b4;
Tb4b4b4}
Te6edf3rawTb4b4b4[Te6edf3lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3outboundTff7b72-Tff7b72>Te6edf3path_lenTb4b4b4;
Te6edf3len Tff7b72+Tff7b72= Te6edf3PacketTff7b72:Tff7b72:Te6edf3writePathTb4b4b4(Tff7b72&Te6edf3rawTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Te6edf3outboundTff7b72-Tff7b72>Te6edf3pathTb4b4b4, Te6edf3outboundTff7b72-Tff7b72>Te6edf3path_lenTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72+ Te6edf3outboundTff7b72-Tff7b72>Te6edf3payload_len Tff7b72> Te6edf3MAX_TRANS_UNITTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Dispatcher::checkSend(): FATAL: Invalid packet queued... too long, len=%dTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3len Tff7b72+ Te6edf3outboundTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4)Tb4b4b4;
Te6edf3_mgrTff7b72-Tff7b72>Te6edf3freeTb4b4b4(Te6edf3outboundTb4b4b4)Tb4b4b4;
Te6edf3outbound Tff7b72= Tffa657NULLTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3rawTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Te6edf3outboundTff7b72-Tff7b72>Te6edf3payloadTb4b4b4, Te6edf3outboundTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4)Tb4b4b4; Te6edf3len Tff7b72+Tff7b72= Te6edf3outboundTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4;
Tffa657uint32_t Te6edf3max_airtime Tff7b72= Te6edf3_radioTff7b72-Tff7b72>Te6edf3getEstAirtimeForTb4b4b4(Te6edf3lenTb4b4b4)Tff7b72*T79c0ff3Tff7b72/T79c0ff2Tb4b4b4;
Te6edf3outbound_start Tff7b72= Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657bool Te6edf3success Tff7b72= Te6edf3_radioTff7b72-Tff7b72>Te6edf3startSendRawTb4b4b4(Te6edf3rawTb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3successTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Dispatcher::loop(): ERROR: send start failed!Ta5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3logTxFailTb4b4b4(Te6edf3outboundTb4b4b4, Te6edf3outboundTff7b72-Tff7b72>Te6edf3getRawLengthTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3releasePacketTb4b4b4(Te6edf3outboundTb4b4b4)Tb4b4b4; T8b949e// return to pool
Te6edf3outbound Tff7b72= Tffa657NULLTb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3outbound_expiry Tff7b72= Te6edf3futureMillisTb4b4b4(Te6edf3max_airtimeTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if MESH_PACKET_LOGGING
Te6edf3SerialTb4b4b4.Te6edf3printTb4b4b4(Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3SerialTb4b4b4.Te6edf3printfTb4b4b4(Ta5d6ff"Ta5d6ff: TX, len=%d (type=%d, route=%s, payload_len=%d)Ta5d6ff"Tb4b4b4,
Te6edf3lenTb4b4b4, Te6edf3outboundTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3outboundTff7b72-Tff7b72>Te6edf3isRouteDirectTb4b4b4(Tb4b4b4) Tff7b72? Ta5d6ff"Ta5d6ffDTa5d6ff" Tff7b72: Ta5d6ff"Ta5d6ffFTa5d6ff"Tb4b4b4, Te6edf3outboundTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3outboundTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_PATH Tff7b72|Tff7b72| Te6edf3outboundTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_REQ
Tff7b72|Tff7b72| Te6edf3outboundTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_RESPONSE Tff7b72|Tff7b72| Te6edf3outboundTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_TXT_MSGTb4b4b4) Tb4b4b4{
Te6edf3SerialTb4b4b4.Te6edf3printfTb4b4b4(Ta5d6ff"Ta5d6ff [%02X -> %02X]Tffea00\nTa5d6ff"Tb4b4b4, Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3outboundTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3outboundTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3SerialTb4b4b4.Te6edf3printfTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3PacketTff7b72* Td2a8ffDispatcher::obtainNewPacketTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72auto Te6edf3pkt Tff7b72= Te6edf3_mgrTff7b72-Tff7b72>Te6edf3allocNewTb4b4b4(Tb4b4b4)Tb4b4b4; T8b949e// TODO: zero out all fields
Tff7b72if Tb4b4b4(Te6edf3pkt Tff7b72=Tff7b72= Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3_err_flags Tff7b72|Tff7b72= Te6edf3ERR_EVENT_FULLTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_len Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3path_len Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3pktTff7b72-Tff7b72>Te6edf3_snr Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3pktTb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffDispatcher::releasePacketTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4) Tb4b4b4{
Te6edf3_mgrTff7b72-Tff7b72>Te6edf3freeTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffDispatcher::sendPacketTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657uint8_t Te6edf3priorityTb4b4b4, Tffa657uint32_t Te6edf3delay_millisTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3PacketTff7b72:Tff7b72:Te6edf3isValidPathLenTb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3path_lenTb4b4b4) Tff7b72|Tff7b72| Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_len Tff7b72> Te6edf3MAX_PACKET_PAYLOADTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Dispatcher::sendPacket(): ERROR: invalid packet... path_len=%d, payload_len=%dTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4(Tffa657uint32_tTb4b4b4) Te6edf3packetTff7b72-Tff7b72>Te6edf3path_lenTb4b4b4, Tb4b4b4(Tffa657uint32_tTb4b4b4) Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4)Tb4b4b4;
Te6edf3_mgrTff7b72-Tff7b72>Te6edf3freeTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3_mgrTff7b72-Tff7b72>Te6edf3queueOutboundTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3priorityTb4b4b4, Te6edf3futureMillisTb4b4b4(Te6edf3delay_millisTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e// Utility function -- handles the case where millis() wraps around back to zero
T8b949e// 2's complement arithmetic will handle any unsigned subtraction up to HALF the word size (32-bits in this case)
Tffa657bool Td2a8ffDispatcher::millisHasNowPassedTb4b4b4(Tffa657unsigned Tffa657long Te6edf3timestampTb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return Tb4b4b4(Tffa657longTb4b4b4)Tb4b4b4(Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3timestampTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4;
Tb4b4b4}
Tffa657unsigned Tffa657long Td2a8ffDispatcher::futureMillisTb4b4b4(Tffa657int Te6edf3millis_from_nowTb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return Te6edf3_msTff7b72-Tff7b72>Te6edf3getMillisTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3millis_from_nowTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.15s